import re

from rest_framework import serializers

from apps.users.models import User


class UserCreaterSerializers(serializers.Serializer):
    # 用户id,只允许读取
    id = serializers.IntegerField(read_only=True)
    # 用户名
    username = serializers.CharField(
        min_length=5,
        max_length=20,
        error_messages={
            'min_length': '用户名不能少于5个字符',
            'max_length': '用户名不能多于20个字符'
        }
    )
    mobile = serializers.CharField()

    # 注册时，不能用中文当作用户名
    def validate_username(self, value):
        """
        对用户名进行合法性检查
        :param value: 要验证的用户名
        :return:  如果验证通过返回value，否则抛出异常
        """
        # 用户名必须包含字母
        if not re.search(r'[a-zA-Z\d_]', value):
            raise serializers.ValidationError('用户名中必须包含字母')
        # 验证用户名是否存在
        if User.objects.filter(username=value):
            raise serializers.ValidationError('此用户名已存在')
        return value

    def validate_mobile(self, value):
        """
        验证手机号是否合法
        :param value: 要验证的手机号
        :return: 如果手机号正确返回value，否则抛出异常
        """
        # 验证手机格式
        if not re.match(r'^1[3-9]\d{9}', value):
            raise serializers.ValidationError("%s不是合法的手机号" % value)
        # 手机号是否存在
        if User.objects.filter(mobile=value):
            raise serializers.ValidationError('该手机号已被使用')

        return value

    password = serializers.CharField(
        write_only=True,
        min_length=6,
        max_length=20,
        error_messages={
            'min_length': '密码不能少于6个字符',
            'max_length': '密码不能超过20个字符'
        }
    )
    password2 = serializers.CharField(
        write_only=True,
        min_length=6,
        max_length=20,
        error_messages={
            'min_length': '密码不能少于6个字符',
            'max_length': '密码不能超过20个字符'
        }
    )

    def validate(self, data):
        password = data.get('password')
        password2 = data.get('password2')
        if password != password2:
            raise serializers.ValidationError('两次密码不一样，请重新输入！')
        return data

    token = serializers.CharField(read_only=True)

    def create(self, data):
        """
        保存数据
        :param data: 一个包含用户名、密码等信息的字典
        :return: 返回一个user对象
        """
        user = User()
        user.username = data.get('username')
        user.mobile = data.get('mobile')
        user.set_password(data.get('password'))
        return user
